package com.yequan.mybatisframework.config;


import com.yequan.mybatisframework.utils.GenericTokenParser;
import com.yequan.mybatisframework.utils.ParameterMappingTokenHandler;

public class SqlSource {

	// 从xml中解析出来的sql文本
	private String sqlText;

	public SqlSource(String sqlText) {
		this.sqlText = sqlText;
	}

	// 该方法返回的BoundSql，其实是一个组合模式
	// BoundSql类中封装的是JDBC可执行的SQL语句，以及该SQL语句对应的参数信息
	// 该方法的调用时机：是SqlSession执行的时候，去调用
	public BoundSql getBoundSql() {
		// 将带有#{}和${}还有SQL片段或者SQL标签的SQL语句，进行处理
		// 只需要将#{}进行处理
		// 直接使用一个成熟的工具类去进行字符串解析即可。
		//
		// 1.如果是${}还有SQL片段或者SQL标签的SQL语句--->解析结果就是字符串的拼接
		//
		// 2.如果是#{}--->解析结果就是带有?的占位符，并且还有ParameterMapping对象
		ParameterMappingTokenHandler handler = new ParameterMappingTokenHandler();
		GenericTokenParser tokenParser = new GenericTokenParser("#{", "}", handler);
		// 返回值就是可以通过JDBC直接执行的SQL语句
		String sql = tokenParser.parse(sqlText);
		// 将解析后的SQL语句和对应的参数信息封装到BoundSql对象中
		return new BoundSql(sql, handler.getParameterMappings());
	}

}
